1
0

AgentClient.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. "use client";
  2. import { AgentDetails } from "@/components/agent-details";
  3. import { Agent } from "@/types/agent";
  4. import { useEffect, useState } from "react";
  5. import { fetchAgentStats } from "@/lib/agents";
  6. export default function AgentClient({ id }: { id: string }) {
  7. const [agents, setAgents] = useState<Agent>();
  8. const [loading, setLoading] = useState<boolean>(true);
  9. const [error, setError] = useState<string | null>(null);
  10. useEffect(() => {
  11. let isMounted = true;
  12. const loadAgents = async () => {
  13. setLoading(true);
  14. setError(null);
  15. try {
  16. const res = await fetch(`/api/agents?agentId=${id}`);
  17. if (!res.ok) throw new Error(`Failed to fetch agent ${id}`);
  18. const data = await res.json();
  19. const agentsResult = await fetchAgentStats(data);
  20. if (isMounted) {
  21. setAgents(Array.isArray(agentsResult) ? agentsResult[0] : agentsResult);
  22. }
  23. } catch (err: any) {
  24. if (isMounted) {
  25. setError(err.message || `Error loading agent ${id}`);
  26. }
  27. } finally {
  28. if (isMounted) {
  29. setLoading(false);
  30. }
  31. }
  32. };
  33. loadAgents();
  34. return () => {
  35. isMounted = false;
  36. };
  37. }, []);
  38. return (
  39. <div className="sticky top-0 z-20 bg-white/80 backdrop-blur-sm border-b">
  40. {error ? (
  41. <div className="p-4 text-red-500">Error loading agents: {error}</div>
  42. ) : !agents || loading ? (
  43. <div className="flex justify-center items-center p-8">
  44. <div className="animate-spin rounded-full h-12 w-12 border-b-2 border-gray-900"></div>
  45. </div>
  46. ) : (
  47. <AgentDetails agent={agents} />
  48. )}
  49. </div>
  50. );
  51. }